package org.gwt.client.controlador;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.gwt.client.TutorService;
import org.gwt.client.TutorServiceAsync;
import org.gwt.client.etiquetas.EtiquetasError;
import org.gwt.client.etiquetas.EtiquetasProblemas;
import org.gwt.client.vista.Listafiguras;
import org.gwt.client.vista.PanelDibujo;
import org.gwt.client.vista.TutorVista;
import org.gwt.client.vista.dialogos.DialogoPlano;
import org.gwt.client.vista.dialogos.DialogoPunto3D;
import org.gwt.client.vista.dialogos.DialogoVector3D;

import com.extjs.gxt.ui.client.Style.LayoutRegion;
import com.extjs.gxt.ui.client.widget.Info;
import com.extjs.gxt.ui.client.widget.layout.BorderLayout;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;

public class TutorControlador implements VistaListener {

	List<Listafiguras> figuras;
	private static final int BOTON_ACERCA = 0;

	private static final int BOTON_PUNTO = 1;
	private static final int BOTON_VECTOR = 2;
	private static final int BOTON_PLANO = 3;

	private static final int MENU_ITEM_PROBLEMA1 = 4;
	private static final int MENU_ITEM_PROBLEMA2 = 5;
	private static final int MENU_ITEM_PROBLEMA3 = 6;

	private static int PROBLEMA_ACTUAL = -1;

	private TutorVista vista;
	@SuppressWarnings("unused")
	private TutorServiceAsync service;
	private EtiquetasProblemas problemas;
	private EtiquetasError error;

	public TutorControlador(TutorVista vista) {
		problemas = GWT.create(EtiquetasProblemas.class);
		error = GWT.create(EtiquetasError.class);
		service = GWT.create(TutorService.class);

		this.vista = vista;
		vista.addListener(this);
		figuras=new ArrayList<Listafiguras>();
	}

	public void botonEvent(int id) {
		switch (id) {
		case BOTON_ACERCA:
			vista.muestraDialogoAcerca();
			break;
		case BOTON_PUNTO:
			vista.muestraDialogoPunto();
			break;
		case BOTON_VECTOR:
			vista.muestraDialogoVector();
			break;
		case BOTON_PLANO:
			vista.muestraDialogoPlano();
			break;
		default:
			Window.alert("Default");
		}
		/*
		 * service.greet("Hola", new AsyncCallback<String>() {
		 *
		 * @Override public void onFailure(Throwable arg0) { }
		 *
		 * @Override public void onSuccess(String arg0) {
		 * System.out.println("En el cliente se recibió: "+arg0);
		 * Window.alert(arg0); } });
		 */
	}

	public void menuEvent(int id) {
		PROBLEMA_ACTUAL = id;
		switch (id) {
		case MENU_ITEM_PROBLEMA1:
			vista.setInicioHabilitado();
			vista.getPanelEncabezado().getBotonProblemas().setText(
					problemas.tituloProblema1());
			vista.setTituloProblema(problemas.tituloProblema1());
			vista.setTextoProblema(problemas.problema1());
			vista.getPanelDibujo().getDibuja().dibujarEjes(false);
			break;
		case MENU_ITEM_PROBLEMA2:
			vista.setInicioHabilitado();
			vista.getPanelEncabezado().getBotonProblemas().setText(
					problemas.tituloProblema2());
			vista.setTituloProblema(problemas.tituloProblema2());
			vista.setTextoProblema(problemas.problema2());
			vista.getPanelDibujo().getDibuja().dibujarEjes(true);
			break;
		case MENU_ITEM_PROBLEMA3:
			vista.setInicioHabilitado();
			vista.getPanelEncabezado().getBotonProblemas().setText(
					problemas.tituloProblema3());
			vista.setTituloProblema(problemas.tituloProblema3());
			vista.setTextoProblema(problemas.problema3());
			vista.getPanelDibujo().getDibuja().dibujarEjes(true);
			break;
		default:
			Window.alert("Default");
		}
		service.seleccionarProblema(""+(id-3), new AsyncCallback<Void>(){
			  @Override public void onFailure(Throwable arg0){
				  System.out.println("Client FAILPROB");
			  }
			  @Override public void onSuccess(Void v) {
				  System.out.println("Client OK");
			  }
		});
	}

	public void botonPlanoEvent() {
		DialogoPlano dPlano = vista.getDialogoPlano();
		String nombre = dPlano.getTextFieldNombre().getValue();
		String ecuacion = dPlano.getTextFieldEcuacion().getValue();

		if (nombre == null)
			Info.display(error.error(), error.planoNombre());
		else {
			if (dPlano.getFieldSetDatos().isExpanded() && ecuacion == null) {
				Info.display(error.error(), error.ecuacionPlano());
			} else {
				vista.getPanelDibujo().getDibuja().dibujarPlano(10, 10, 10, 5,
						"Plano" + nombre, "cyan");
				dPlano.hide(true);
			}
		}
	}
	//


	public void botonPunto3DEvent() {
		DialogoPunto3D dPunto = vista.getDialogoPunto3D();
		String nombre = dPunto.getTextFieldNombre().getValue();
		Number x = dPunto.getNumberFieldX().getValue();
		Number y = dPunto.getNumberFieldY().getValue();
		Number z = dPunto.getNumberFieldZ().getValue();

		if (nombre == null)
			Info.display(error.error(), error.puntoNombre());
		else {
			if (dPunto.getFieldSetDatos().isExpanded()) {
				if (dPunto.getFieldSetDatos().isExpanded() && x == null)
					Info.display(error.error(), error.coordenadaX());
				else if (dPunto.getFieldSetDatos().isExpanded() && y == null)
					Info.display(error.error(), error.coordenadaY());
				else if (dPunto.getFieldSetDatos().isExpanded() && z == null)
					Info.display(error.error(), error.coordenadaZ());
				else {
					vista.getPanelDibujo().getDibuja().dibujarPunto(
							x.intValue(), y.intValue(), z.intValue(),
							"Punto" + nombre, "blue");

					dPunto.hide(true);
				}
			} else {
				vista.getPanelDibujo().getDibuja().dibujarPunto(3, 3, 3,
						"Punto" + nombre, "blue");
				dPunto.hide(true);
//				Listafiguras p = new Listafiguras(3, 3, 3, BOTON_PUNTO, "P"
//						+ nombre, "blue");
//				figuras.add(p);
			}
		}
	}

	public void botonVector3DEvent() {
		DialogoVector3D dVector = vista.getDialogoVector3D();
		// String vector = dVector.getSimpleComboTipoVector().getSimpleValue();
		String nombre = dVector.getTextFieldNombre().getValue();
		Number x = dVector.getNumberFieldX().getValue();
		Number y = dVector.getNumberFieldY().getValue();
		Number z = dVector.getNumberFieldZ().getValue();
		String defVec="";

		if (nombre == null)
			Info.display(error.error(), error.vectorNombre());
		else {
			if (dVector.getFieldSetDatos().isExpanded()) {
				if (dVector.getFieldSetDatos().isExpanded() && x == null)
					Info.display(error.error(), error.coordenadaX());
				else if (dVector.getFieldSetDatos().isExpanded() && y == null)
					Info.display(error.error(), error.coordenadaY());
				else if (dVector.getFieldSetDatos().isExpanded() && z == null)
					Info.display(error.error(), error.coordenadaZ());
				else {
					vista.getPanelDibujo().getDibuja().dibujarVector(
							x.intValue(), y.intValue(), z.intValue(),
							"Vector" + nombre, "blue");
					Listafiguras p = new Listafiguras(x.intValue(), y
							.intValue(), z.intValue(), BOTON_VECTOR, "V"
							+ nombre, "blue");

				}
				defVec=nombre+"("+x.intValue()+","+y.intValue()+","+z.intValue()+")";
			} else {
				Info.display("dos","cadenas");
				vista.getPanelDibujo().getDibuja().dibujarVector(3, 3, 3,
						"Punto" + nombre, "black");
				defVec=nombre+"(x,y,z)";
				Listafiguras p = new Listafiguras(3, 3, 3, BOTON_VECTOR, "V"
						+ nombre, "blue");

				figuras.add(p);
			}

			//VALIDAR RED
			System.out.println("DD "+defVec);
			service.validaVectorPosicion(defVec, new AsyncCallback<String>(){
				  @Override
				  public void onFailure(Throwable arg0){
					  System.out.println("Client FAIL");
				  }
				  @Override
				  public void onSuccess(String s) {
					  System.out.println("RESPUESTA: "+s);
				  }
			});
			dVector.hide(true);
		}
	}

	public void botonOk() {
//		vista.getPanelDibujo().agregaEcuacion(nombre);
		PanelDibujo panelDibujo = vista.getPanelDibujo();
		panelDibujo.agregaEcuacion(panelDibujo.getTextFieldEcuacion()
				.getValue());
		panelDibujo.getTextFieldEcuacion().clear();
		// Info.display("OKAS", "Presiono para introducir una ecuacion");
	}

	public void botonAyudaEvent() {
		BorderLayout bl = vista.getContenedor();
		if (vista.getCollapse() == true) {
			bl.expand(LayoutRegion.EAST);
			vista.setCollapse(false);
		} else {
			bl.collapse(LayoutRegion.EAST);
			vista.setCollapse(true);
		}
	}

	@Override
	public void escalarCanvas() {
		Iterator<Listafiguras> iterator = figuras.iterator();
		if(PROBLEMA_ACTUAL==4){
			vista.getPanelDibujo().getDibuja().dibujarEjes(false);

			while (iterator.hasNext()) {
				iterator.next().dibujar(vista.getPanelDibujo().getDibuja(),false);
			}
		}
		else if(PROBLEMA_ACTUAL==5||PROBLEMA_ACTUAL==6){
			vista.getPanelDibujo().getDibuja().dibujarEjes(true);
			while (iterator.hasNext()) {
				iterator.next().dibujar(vista.getPanelDibujo().getDibuja(),true);
			}
		}
	}

}